package com.kylin.common.core.service;

import com.kylin.common.core.entity.TreeEntity;

import java.io.Serializable;
import java.util.List;

/**
 * 通用树类服务接口
 *
 * @author wuhao
 * @version 1.0 - 2019-06-04
 */
public interface TreeService<T extends TreeEntity<T>> extends BaseService<T> {

    /**
     * 根据ID查询对象
     * @param id 主键ID
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    T getById(Serializable id);

    /**
     * 获取单个对象
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    T get(T entity);

    /**
     * 根据条件获取list结果
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    List<T> list(T entity);

    /**
     * 新增数据
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int insert(T entity);

    /**
     * 更新数据
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int update(T entity);

    /**
     * 保存数据（插入或更新）
     * 实现自动保存字段：所有父级编号、所有排序号、是否是叶子节点、节点的层次级别等数据
     * 实现级联更新所有子节点数据：同父级自动保存字段
     * @param entity 树节点
     * @return
     * @version 1.0  by wuhao at 2019-08-13
     */
    int save(T entity);

    /**
     * 删除数据
     * 级联删除子节点和父节点的tree_leaf字段
     * @param id 编号ID
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int delete(Serializable id);


    /**
     * 将简单列表code，parentCode转换为嵌套列表格式【code,children[code,children[...]]】
     * @param sourceList 源数据列表
     * @param parentId 目标数据列表的顶级节点
     * @return
     * @version 1.0  by wuhao at 2019-08-13
     */
    List<T> convertChildList(List<T> sourceList, Serializable parentId);
}
